﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAL;
using DAL.Repositories;
using EntitiesLayer;
using System.Data.SqlClient;
using System.Data;
using DAL.Repositorios;

namespace BLL
{
    public class GestorMantMusculos
    {
        
        public void registrarMusculo(string pNombre, int pIdTipoMusculo, int pIdUbucacionMusculo)
        {
            if (!(Enum.IsDefined(typeof(Ubicacion), pIdUbucacionMusculo)
                && Enum.IsDefined(typeof(Ubicacion), pIdUbucacionMusculo)))
                throw new ArgumentException("El tipo o la ubicacion son invalidas");
                
            Musculos musculo = new Musculos(nombre: pNombre, 
                tipo: (TipoMusculo)pIdTipoMusculo, 
                ubicacion: (Ubicacion)pIdUbucacionMusculo);

            UnitOfWork.RepositoryMusculo.Insert(musculo);
            
        }
        public IEnumerable<Musculos> listarMusculo() {
            return UnitOfWork.RepositoryMusculo.GetAll();
        }


        public IList<Musculos> listarMusculosPrimarios(int idEjercicio)
        {
            Ejercicio ejercicio= UnitOfWork.RepositoryEjercicio.GetById(idEjercicio);

            if (ejercicio!=null) 
                return ejercicio.MusculosPrimarios;

            return null;
        }

        public void AsignarMuchosMusculosP(long idEjercicio, long[] idsMusculos, bool LimpiarEntes)
        {

            IRepositoryRelations<long, long> repoPM = UnitOfWork.RepositoryMPrimarioXEjercicio;
            foreach (long idMusculoP in idsMusculos)
                repoPM.Asign(idEjercicio, idMusculoP);

            Action eliminarTodos = () => repoPM.RemoveAllFromKey(idEjercicio);

            repoPM.ActionBeforeSave += LimpiarEntes ? eliminarTodos : () => { };

            repoPM.Save();
        }

        public void AsignarMuchosMusculosS(long idEjercicio, long[] idsMusculos, bool limpiarAntes)
        {

            IRepositoryRelations<long, long> repoSM = UnitOfWork.RepositoryMSecundarioXEjercicio;

            foreach (long idMusculoS in idsMusculos)
                repoSM.Asign(idEjercicio, idMusculoS);

            Action eliminarTodos = () => repoSM.RemoveAllFromKey(idEjercicio);

            repoSM.ActionBeforeSave = limpiarAntes ? eliminarTodos : () => { };

            repoSM.Save();
        }
        public void AsignarMuchosSPTrasaccion(long idEjercicio, long[] primarios, 
            long[] secundarios, bool LimpiarAntes)
        {
            UnitOfWork.RepositoryMPrimarioXEjercicio.ActionAfterSave =
                () => AsignarMuchosMusculosS(idEjercicio, secundarios, LimpiarAntes);

            //como esta operacion utiliza el mismo repositorio entonces las consulas van a ocurrir en un misma transaccion
            AsignarMuchosMusculosP(idEjercicio, primarios, LimpiarAntes);
            
        }
        public IList<Musculos> ListarMusculosSecundarios(int idEjercicio)
        {
            Ejercicio ejercicio = UnitOfWork.RepositoryEjercicio.GetById(idEjercicio);

            if (ejercicio != null)
                return ejercicio.MusculosSecundarios;

            return null;
        }

        public void actualizarMusculo(int pId, string pNombre, int pIdTipoMusculo, int pIdUbucacionMusculo)
        {
            if (!(Enum.IsDefined(typeof(Ubicacion), pIdUbucacionMusculo)
              && Enum.IsDefined(typeof(Ubicacion), pIdUbucacionMusculo)))
                throw new ArgumentException("El tipo o la ubicacion son invalidas");

            Musculos musculo = new Musculos(nombre: pNombre,
                tipo: (TipoMusculo)pIdTipoMusculo,
                ubicacion: (Ubicacion)pIdUbucacionMusculo,
                idMusculo: pId
                );

            UnitOfWork.RepositoryMusculo.Update(musculo);
        }



        public void eliminarMusculo(int idMusculo) {

            UnitOfWork.RepositoryMusculo.Delete(new Musculos(idMusculo));
        
        }

        public Musculos consultarPorId(int id) {

            return UnitOfWork.RepositoryMusculo.GetById(id);
        
        }
        public void guardarCambios()
        {
            UnitOfWork.RepositoryMusculo.Save();   
        }




    }

}
